package org.zyj.io;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Echo Server 1
 * 第一代: BIO
 * ----
 * 优点:
 * 简单, 不容易出错
 * ----
 * 缺点:
 * 能处理的连接数量, 受限于线程的数量, 那么就必然导致 不能处理太多的连接
 */
public class BIODemo {

    public static void main(String[] args) throws IOException {
        //...
        ServerSocket server = new ServerSocket(8080);
        while (true) {
            Socket client = server.accept(); //主线程: 阻塞操作1
            //一般情况下, 在accept之后会把这个client交给其他线程处理
            new Thread() {
                InputStream inputStream = client.getInputStream(); //其他线程: 阻塞操作2
            }.start();
        }
        //... 省略若干代码
    }
}
/**
 * 小工具,可以用来看epoll之类的东西
 * 查看进程的各个线程的系统调用, 将系统调用输出到 out.xyz 文件中
 * strace -ff -o out java xxx
 * <p>
 * socket() //创建一个文件描述符
 * bind() //将这个文件描述符,绑定到某个端口上
 * accept() //原始的阻塞方式
 * select() //
 * poll() //select()的升级版
 * epoll_create() //多路复用器的监听方式
 * epool_ctl()
 */